package serveur;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Calendar;

public class TraitementClient extends Thread{ 

     Integer AUTHENTIFICATION   =1;
     Integer INSCRIPTION        =2;
     Integer ENVOYEMESSAGESALON =3;
     Integer ENOYEMESSAGECLIENT =4;
     Integer AJOUTERCONTACT     =5;
     Integer SUPPRIMERCONTACT   =6;
     Integer FERMETURECONNEXION =7;
     
     Integer ECHEC_AUTHENTIFICATION  =0;
     Integer SUCCES_AUTHENTIFICATION =1;
     
    Socket socketTransfert;
    OutputStream out;//pour récupérer le flot de sortie de la socket
    InputStream in;//pour récupérer le flot d'entrée de la socket
    DataOutputStream sortie;//float d'entrée pour données typées
    DataInputStream entree;//float de sortie pour données typées
    Serveur serveur;
    String pseudo;
    String pseudoClient;
    String nom;
    String prenom;
    String email;
    String motDePasse;
    String message;
    String nomTab;
    Boolean connexionOuverte = true;
    //PENSER À CRÉER UN UTILISATEUR =new utilisateur(nom,prenom...)
    
        //************************************************************
        public TraitementClient(Socket socketTransfert,Serveur s){
                super();
                System.out.println("connexion client");
                serveur = s;
                try{
                    this.socketTransfert = socketTransfert;
                    try{ this.in = this.socketTransfert.getInputStream(); }catch(Exception e){}//récupérer le flot d'entrée de la socket (dans in)
                    this.entree = new DataInputStream(this.in);//création du flot d'entrée pour données typées
                    try{this.out = this.socketTransfert.getOutputStream(); }catch(Exception e){}//récupérer le flot de sortie de la socket (dans out)
                    this.sortie  = new DataOutputStream(this.out);//création du flot de sortie pour données typées 
                }
                catch(Exception e){
                    System.out.println("Erreur dans le constructeur TraitementClient : " + e.toString());
                }
        }

        //****************
        public void run(){
            int code;
            while(connexionOuverte){ 
                try {
                    code = this.entree.readInt();
                    if(code==AUTHENTIFICATION){
                        this.lectureMessageAuthentification();
                    }else if(code==INSCRIPTION){
                        this.lectureMessageInscription();
                    }else if(code==ENVOYEMESSAGESALON){
                        this.lectureMessageSalon();
                    }else if(code==ENOYEMESSAGECLIENT){
                        this.lectureMessageClient();
                    }else if(code==AJOUTERCONTACT){
                        this.ajouterContact();
                    }else if(code==SUPPRIMERCONTACT){
                        this.supprimerContact();
                    }else if(code==FERMETURECONNEXION){
                        connexionOuverte=false;
                        this.fermetureConnexionTCP();
                        System.out.println("Fermeture de connexion avec le client : " + this.pseudoClient);
                    }
                } catch(Exception e){
                    System.out.println("Erreur dans ma méthode run 'TraitementClient' : " + e.getMessage() + "   "+ e.toString());
                }
            }                   
        }   

//AUTHENTIFICATION
        public void lectureMessageAuthentification(){
            Boolean trouver=false;
            try {
                pseudoClient = this.entree.readUTF();
                System.out.println("pseudo recu : " + pseudoClient);
                
                for(String key : serveur.utilisateurs.keySet()){ //Ajouter mot de passe compatible
                    if(serveur.utilisateurs.get(key).getPseudo().equalsIgnoreCase(pseudoClient))
                        trouver = true;
                }
                
                if(!trouver){//Echéc autentification
                    System.out.println("Utilisateur non trouvé");
                    this.sortie.writeInt(ECHEC_AUTHENTIFICATION);
                }else{
                    System.out.println("Utilisateur trouvé");
                    this.sortie.writeInt(SUCCES_AUTHENTIFICATION);
                    
                    for(String key : serveur.salons.keySet()){
                       this.sortie.writeUTF(serveur.salons.get(key).getTitre());
                       this.sortie.writeUTF(serveur.salons.get(key).getCotenu());
                    }
                    this.sortie.writeUTF("finSalons");
                    
                    for(String key : serveur.utilisateurs.get(pseudoClient).getContacts().keySet()){
                       this.sortie.writeUTF(serveur.utilisateurs.get(pseudoClient).getContacts().get(key).getPseudo()); 
                       this.sortie.writeUTF(serveur.utilisateurs.get(pseudoClient).getContacts().get(key).getNom());
                       this.sortie.writeUTF(serveur.utilisateurs.get(pseudoClient).getContacts().get(key).getPrenom());
                       this.sortie.writeUTF(serveur.utilisateurs.get(pseudoClient).getContacts().get(key).getEmail());
                       this.sortie.writeUTF(serveur.utilisateurs.get(pseudoClient).getContacts().get(key).getMotDePasse());
                    }
                    this.sortie.writeUTF("finContacts");
                }
            }catch(Exception e){
                    System.out.println("Erreur dans le lectureMessageAuthentification TraitementClient : " + e.toString() );
            }
        }

//INSCRIPTION
        public void lectureMessageInscription(){
            try {
                pseudo = this.entree.readUTF();
                nom = this.entree.readUTF();
                prenom = this.entree.readUTF();
                email = this.entree.readUTF();
                motDePasse= this.entree.readUTF();
                Utilisateur u = new Utilisateur(pseudo,nom,prenom,email,motDePasse);
                serveur.ajouterUtilisateur(pseudo,u);
            } catch (Exception e){
                System.out.println("Erreur dans LectureMessageInscription : " + e.getMessage());
            }
        }
        
//ENVOYE_MESSAGE_SALON
        public void lectureMessageSalon(){
            try{
                Calendar DateActuelle = Calendar.getInstance();
                pseudo = entree.readUTF();
                nomTab = entree.readUTF();
                message = entree.readUTF();
                System.out.println(pseudo+" ("+DateActuelle.getTime().getTime()+")  dit : "+ message +" dans "+nomTab);
                for(Integer key : serveur.traites.keySet()){
                    serveur.traites.get(key).sortie.writeUTF(nomTab);
                    serveur.traites.get(key).sortie.writeUTF(pseudo+" ("+DateActuelle.getTime().toString().substring(11, 16) +")  dit : " + message);
                }
            }catch(Exception e){
                    System.out.println("Erreur dans le LectureMessageSalon TraitementClient : " + e.toString() );
            }
        }

//ENVOYE_MESSAGE_CLIENT
        public void lectureMessageClient(){
              try{
                Calendar DateActuelle = Calendar.getInstance();
                pseudo = entree.readUTF();
                nomTab = entree.readUTF();
                message = entree.readUTF();
                System.out.println(pseudo+" ("+DateActuelle.getTime().getTime()+")  dit : "+ message +" dans "+nomTab);
                for(Integer key : serveur.traites.keySet()){
                    if(serveur.traites.get(key).getPseudo().equalsIgnoreCase(nomTab)){
                        serveur.traites.get(key).sortie.writeUTF(nomTab);
                        serveur.traites.get(key).sortie.writeUTF(pseudo+" ("+DateActuelle.getTime().toString().substring(11, 16) +")  dit : " + message);
                    }
                        
                }
            }catch(Exception e){
                    System.out.println("Erreur dans le LectureMessageSalon TraitementClient : " + e.toString() );
            }
        }

//AJOUTER_CONTACT
        public void ajouterContact(){
            
        }
     
//SUPPRIMER_CONTACT
        public void supprimerContact(){
            
        }
        
//FERMETURE_CONNEXION
        public void fermetureConnexionTCP() {
            try {
                socketTransfert.close();
            } catch (Exception e) {
                System.out.println("Exception levée lors de la fermeture de la connexion 'Client' : " + e.getMessage());
            }
        }
        
 public String getPseudo(){
     return this.pseudoClient;
 }
}//Fin de la classe TraitementClient